﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using Joel.Vishnu.AccesoDatos.SQL_Server;
using Joel.Vishnu.AccesoDatos.Interfaces;
using Joel.Vishnu.Modelo.Entidades;

namespace Joel.Vishnu.Repositorios
{
    public class RepositorioEmpleado : RepositorioEntidad<Empleado, Int32>
    {
        #region Constructores

        public RepositorioEmpleado()
            : base()
        {
            servicioDatosEmpleado = new ServicioDatosEmpleado();
            repositorioBarrio = new RepositorioBarrio();
            repositorioGenero = new RepositorioGenero();
            repositorioEstadoCivil = new RepositorioEstadoCivil();
        }

        #endregion

        #region Atributos

        private IServicioDatosEmpleado servicioDatosEmpleado;
        private RepositorioBarrio repositorioBarrio;
        private RepositorioGenero repositorioGenero;
        private RepositorioEstadoCivil repositorioEstadoCivil;

        #endregion

        #region Propiedades

        public IServicioDatosEmpleado ServicioDatosEmpleado
        {
            get { return servicioDatosEmpleado; }
        }

        #endregion

        #region Metodos

        protected override Empleado FilaAEntidad(DataRow fila)
        {
            Empleado empleado = new Empleado();
            empleado.Id = (Int32)fila["EmpleadoId"];
            empleado.Nombre = (String)fila["Nombre"];
            empleado.Apellido = (String)fila["Apellido"];
            empleado.Dni = Convert.ToInt32(fila["Dni"]);
            empleado.Telefono = (String)fila["Telefono"];
            empleado.Direccion = (String)fila["Direccion"];
            empleado.Barrio = repositorioBarrio.DevolverPorId((Int32)fila["BarrioId"]);
            empleado.Email = (String)fila["Email"];
            empleado.Genero = repositorioGenero.DevolverPorId((Int32)fila["GeneroId"]);
            empleado.FechaContratacion = (DateTime)fila["FechaContratacion"];
            empleado.FechaCumpleanos = (DateTime)fila["FechaCumpleanos"];
            empleado.EstadoCivil = repositorioEstadoCivil.DevolverPorId((Int32)fila["EstadoCivilId"]);
            empleado.ContactoEmergenciaNombre = (String)fila["ContactoEmergenciaNombre"];
            empleado.ContactoEmergenciaTelefono = (String)fila["ContactoEmergenciaTelefono"];
            empleado.Salario = (Decimal)fila["Salario"];
            return empleado;
        }

        public override Empleado DevolverPorId(Int32 id)
        {
            Empleado entidad = entidades.Where(x => x.Id == id).FirstOrDefault();
            if (entidad == null)
                using (var ds = ServicioDatosEmpleado.Empleados_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        entidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(entidad);
                    }
            return entidad;
        }

        public List<Empleado> DevolverTodos()
        {
            using (var ds = ServicioDatosEmpleado.Empleados_DevolverTodos())
                entidades = TablaALista(ds.Tables[0]);
            return entidades;
        }

        public void Insertar(Empleado entidad)
        {
            entidad.Id = ServicioDatosEmpleado.Empleados_Insertar(entidad.Nombre, entidad.Apellido, entidad.Dni, entidad.FechaCumpleanos, entidad.Genero.Id, entidad.Email, entidad.Telefono, entidad.Direccion, entidad.Barrio.Id, entidad.FechaContratacion, entidad.EstadoCivil.Id, entidad.ContactoEmergenciaNombre, entidad.ContactoEmergenciaTelefono, entidad.Salario);
        }

        public void Modificar(Empleado entidad)
        {
            ServicioDatosEmpleado.Empleados_Modificar(entidad.Id, entidad.Nombre, entidad.Apellido, entidad.Dni, entidad.FechaCumpleanos, entidad.Genero.Id, entidad.Email, entidad.Telefono, entidad.Direccion, entidad.Barrio.Id, entidad.FechaContratacion, entidad.EstadoCivil.Id, entidad.ContactoEmergenciaNombre, entidad.ContactoEmergenciaTelefono, entidad.Salario);
        }

        public void Eliminar(Empleado entidad)
        {
            ServicioDatosEmpleado.Empleados_Eliminar(entidad.Id);
            entidad = null;
        }

        #endregion
    }
}
